So uhh
Hoi.
I’ve been using the fish shell for almost 5 years now and so I think that Kinda justifies me giving a proper review instead of those people who just use it for a week or so and then drop it. Though I haven’t used 100% of ALL the features(Honestly nobody probably has) so uhhh… I can’t really talk about some random niche feature or something like that. My review is purely from the view of a random developer who just consistently used it for a long time.
Why fish?
Well it all started back in 2021 I think. I was looking at a Luke Smith video and saw his shell config with autocomplete, syntax highlighting and stuff like that. As a bash user at that time I was genuinely amazed at that zsh config. So I tried to use it but then realized one issue. The autocomplete fucking sucked and so did the command flag completion. So I went on google and tired looking for a better shell to do my work in. And that’s when I found Fish. It ticked all the boxes for me. They were:
- Syntax highlighting(Better than the one in the ZSH plugin tbh)
- Command completion / History completion (Also better than zsh and my main reason for switching)
- Faster than Zsh (even though some morons think that zsh is faster due to a myth)
- User friendly
So since it was faster better stronger (heh heh…) than ZSH and faster too (zsh+ oh-my-zsh was super slow when starting up) and most importantly DID ALL THAT WITHOUT USING PLUGINS made me switch instantly.
Honestly I was amazed at the fact that it was able to achieve all that without even using plugins.
What made it actually worthwhile
Completion.
Like I said in the beginning, the completion is the thing that made me switch to it. The shell completes to the nearest similar command or command line argument / command flag. So for example if you write gc it will automatically suggest gcc in the completion. Plus it does history completion. So for example if you had a long command like sudo dd if=Downloads/archlinux-2025.08.01-x86_64.iso of=/dev/sdd bs=4M oflag=sync status=progress and then just start typing sudo dd then it’ll suggest the command as a completion.
Well you might think that that’s what Zsh does with the plugins and stuff but nope. Zsh only pulls from the history of the commands you previously typed out. That’s because ZSH has no proper native completion system/format and only relies on various plugins which is just a hassle unlike Fish.
And this completion system is also a bit faster. Not 100% sure about it but it certainly feels faster. (tbh might also be a placeboo effect thing so uhh ;-;). Also it is easy to write completions for as a dev who’s writing a CLI tool.
Plus it does tab completion for various package managers like apt or pacman. Which zsh sometimes struggles with (or at least it did when I was using it a while ago… 2023 I think)
Syntax highlighting
So uhh…. It has syntax highlighting natively. IDK how I can claim that it is better or worse than the ones provided by zsh/bash plugins so uhhh….
Only thing I can consider an edge is the fact that it is native unlike the one in ZSH.
Scripting.
This is one part that might actually be a bit contoversial. Fish uses a whole another system for scripting. It’s not similar to POSIX bash or even a superset like ZSH scripting. It is a whole separate lang with its own upsides and downsides. Buttt you can just run bash style one liners with a plugin like bax . Uhh… Speaking of plugins….
Plugin ecosystem
One more thing I do like about fish is the way things integrate with it.
Personally I am using Zoxide for a better cd alternative, fzf as a rudimentary TUI and starship for the prompt.
And they all work flawlessly.
And installing plugins is pretty painless as well. I personally use the plugin manager called fisher. All you need to do is run fisher install package_name and it’ll work just like that. No need to mess around with any sort of config file or anything like that.
Also since fish comes out of the box with a lot of the stuff, you don’t even really need that many plugins. For example I only use 2 plugins and I could actually live without them NGL.
Performance
Well reading all that mihgt make you think that Fish is slower than the other shells but actually it is somehow FASTER. It is written in rust (well it was originally not written in rust but the shell actually got re-written in rust a few months ago). And since it doesn’t rely on any crappy bloated frameworks like OMZ, it is pretty lean. It starts up NOTICEABLY faster than zsh.
So uhh
Use fish. it gud.
><> blub blub.